package bombita.modelo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import bombita.controlador.ControladorPersonaje;
import bombita.modelo.Mapa.Mapa;
import bombita.persistencia.DeserializadorJuego;

public class Juego
{
	protected Mapa mapa;
	protected List<ControladorPersonaje> jugadores;
	
	private void cargarXml(InputStream istream) throws Exception
	{
		SAXBuilder sax = new SAXBuilder();
		Document nivel = sax.build(istream);
		DeserializadorJuego deser;
		deser = new DeserializadorJuego(nivel.getRootElement());
		mapa = deser.getMapa();
		jugadores = deser.getJugadores();
		
		for (ControladorPersonaje jugador : jugadores) {
			jugador.agregarVista(this);
			jugador.inicioJuego();
		}
		mapa.cicloDeJuego();
		for (ControladorPersonaje jugador : jugadores) {
			jugador.terminoJuego();
		}
	}
	
	public Juego(File file)
	{
		FileInputStream fileStream = null;
		try {
			fileStream = new FileInputStream(file);
			try {
				this.cargarXml(fileStream);
			} catch (Exception e) {
				e.printStackTrace();
			}
			fileStream.close();
		} catch (FileNotFoundException e) { 
		} catch (IOException e) {}
	}
	
	public Juego (String url)
	{
		try {
			InputStream fileStream = this.getClass().getResourceAsStream(url);
			this.cargarXml(fileStream);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public Juego (int nivel)
	{
		this("/resource/level" + Integer.toString(nivel) + ".xml");
	}

	public Mapa getMapa()
	{
		return mapa;
	}
	
	public Element serializar ()
	{
		Element raiz = new Element("Juego");
		
		Element raizJugadores = new Element("jugadores");
		for (ControladorPersonaje jugador : jugadores) {
			Element nodoJugador = new Element(jugador.getClass().getName().substring("bombita.controlador.".length()));
			nodoJugador.setAttribute("id", jugador.getId());
			raizJugadores.addContent(nodoJugador);
		}
		raiz.addContent(raizJugadores);
		raiz.addContent(mapa.serializar());
		return raiz;
	}
}
